home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_09 / barbu2 / modal2.cpp < prev    next >
C/C++ Source or Header  |  1995-05-08  |  4KB  |  173 lines

  1. // MODAL2, MODALDLG's behaviour
  2. //////////////////////////////////////////////////////
  3. #include "MODALDLG.HPP"
  4. #include "KW.HPP"
  5. #include <assert.h>
  6.  
  7. const char far MODALDLG::A_HPTR[] = "a";
  8. const char far MODALDLG::A_LPTR[] = "b";
  9.  
  10. BOOL CALLBACK _export
  11. MODALDLG::_DlgProc(HWND hWnd, UINT iMsg,
  12.                 WPARAM wParam, LPARAM lParam)
  13. {
  14. MODALDLG* p = HWIN2this(hWnd);
  15. if(p == 0){
  16.     if(iMsg != WM_INITDIALOG)
  17.         return FALSE;
  18.     SetProp(hWnd, A_HPTR, (HANDLE)(HIWORD(lParam)));
  19.     SetProp(hWnd, A_LPTR, (HANDLE)(LOWORD(lParam)));
  20.     ((MODALDLG*)lParam)->_hDlg = hWnd;
  21.     p = HWIN2this(hWnd);
  22.     }
  23. assert(hWnd == p->_hDlg);
  24. return p->proc(iMsg, wParam, lParam);
  25. }
  26.  
  27. BOOL MODALDLG::proc(UINT iMsg,
  28.                     WPARAM wParam, LPARAM lParam)
  29. {
  30. int i;
  31. STR Buf;
  32. WORD wId, wCmd;
  33. CTL* Last = 0;
  34. switch(iMsg){
  35.     case WM_INITDIALOG:
  36.         _thinFontJob();
  37.         SetWindowText(_hDlg,
  38.                     _dlgline.value(KW::LABEL, Buf));
  39.         Buf[0] = 0;
  40.         SetDlgItemText(_hDlg, IDOK,
  41.                     _dlgline.value(KW::OK, Buf));
  42.         Buf[0] = 0;
  43.         SetDlgItemText(_hDlg, IDCANCEL,
  44.                     _dlgline.value(KW::CANCEL, Buf));
  45.         for(i = 0; i < _ng; i++)
  46.             SetDlgItemText(_hDlg, i+3, _pGXY[i].name);
  47.         for(i = _xOffset; i < _xOffset +_nCtls; i++){
  48.             CTL* pCtl = _ctab[i].ctl;
  49.             if(pCtl != 0 && pCtl != Last){
  50.                 pCtl->initScreen(_hDlg);
  51.                 Last = pCtl;
  52.                 }
  53.             }
  54.         _nActiveGroup = -1;
  55.         _forceActiveGroup(_guru->get(_dsect, 0));
  56.         _centerOnScreen();
  57.         break;
  58.  
  59.     case WM_DRAWITEM:
  60.         _drawTab((LPDRAWITEMSTRUCT)lParam);
  61.         break;
  62.  
  63.     case WM_COMMAND:
  64.         wId = LOWORD(wParam);
  65. #if defined(WIN32)
  66.         wCmd = HIWORD(wParam);
  67. #else
  68.         wCmd = HIWORD(lParam);
  69. #endif
  70.         if(wId >= _ng + 3){
  71.             CTL* pCtl = _ctab[wId].ctl;
  72.             if(pCtl)
  73.                 return pCtl->wm_command(wId, wCmd);
  74.             }
  75.         switch(wId){
  76.             case IDOK:
  77.                 _endDialog(SHOWDATA::OK);
  78.                 break;
  79.             case IDCANCEL:
  80.                 _endDialog(SHOWDATA::CANCEL);
  81.                 break;
  82.             default:
  83.                 _setActiveGroup(wId-3);
  84.                 break;
  85.             }
  86.         break;
  87.  
  88.     default:
  89.         return FALSE;
  90.     }
  91. return TRUE;
  92. }
  93.  
  94. void MODALDLG::_endDialog(SHOWDATA::RET Result)
  95. {
  96. if(Result == SHOWDATA::OK){
  97.     int i;
  98.     CTL *Last = 0;
  99.     // check consistency first:
  100.     for(i = _xOffset; i < _xOffset + _nCtls; i++){
  101.         CTL* pCtl = _ctab[i].ctl;
  102.         if(pCtl != 0  && pCtl != Last){
  103.             if(!pCtl->isDataOk()){
  104.                 _forceActiveGroup(_ctab[i].group);
  105.                 SetFocus(GetDlgItem(_hDlg, i));
  106.                 return;
  107.                 }
  108.             Last = pCtl;
  109.             }
  110.         }
  111.     // save data:
  112.     for(i = _xOffset; i < _xOffset + _nCtls; i++){
  113.         CTL* pCtl = _ctab[i].ctl;
  114.         if(pCtl != 0  && pCtl != Last){
  115.             pCtl->saveData();
  116.             Last = pCtl;
  117.             }
  118.         }
  119.     // save last active group for next dialog show:
  120.     ((SHOWDATA*)_guru)->set(_dsect, _nActiveGroup);
  121.     }
  122. RemoveProp(_hDlg, A_HPTR);
  123. RemoveProp(_hDlg, A_LPTR);
  124. EndDialog(_hDlg, (int)Result);
  125. }
  126.  
  127. void MODALDLG::_forceActiveGroup(int nG)
  128. {
  129. _setActiveGroup(nG);
  130. InvalidateRect(_hDlg, NULL, TRUE);
  131. }
  132.  
  133. void MODALDLG::_setActiveGroup(int nG)
  134. {
  135. if(_nActiveGroup == nG || !_ng)
  136.     return;
  137. int Last = _nActiveGroup;
  138. _nActiveGroup = nG;
  139. InvalidateRect(GetDlgItem(_hDlg, 3 + nG), NULL, TRUE);
  140. InvalidateRect(GetDlgItem(_hDlg, 3 + Last), NULL, TRUE);
  141. for(int i = _xOffset; i < _xOffset + _nCtls; i++){
  142.     HWND hItem = GetDlgItem(_hDlg, i);
  143.     if(_ctab[i].group == _nActiveGroup)
  144.         ShowWindow(hItem, SW_RESTORE);
  145.     else
  146.         ShowWindow(hItem, SW_HIDE);
  147.     }
  148. }
  149.  
  150. SHOWDATA::RET MODALDLG::run()
  151. {
  152. HGLOBAL hMem;
  153. DLGPROC lpfn;
  154.  
  155. hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,
  156.                     _template.len());
  157. if(!hMem)
  158.     return SHOWDATA::MEMORYOUT;
  159. char* lpTempl = (char*)GlobalLock(hMem);
  160. memcpy(lpTempl, _template.get(), _template.len());
  161. GlobalUnlock(hMem);
  162. lpfn = (DLGPROC)MakeProcInstance((FARPROC)_DlgProc,
  163.                                 _hI);
  164. int res = DialogBoxIndirectParam(_hI, hMem, _hP,
  165.                             lpfn, (LPARAM)this);
  166. FreeProcInstance((FARPROC)lpfn);
  167. GlobalFree(hMem);
  168. if(res == -1)
  169.     return SHOWDATA::SYNTAXERR;
  170. return (SHOWDATA::RET)res;
  171. }
  172.  
  173.